/* list.h 简单列表类型的头文件 */
#ifndef LIST_H_
#define LIST_H_
#include <stdbool.h>   /* C99特性*/

/* 特定于程序的声明 */
#define TSIZE 45 /* 存放片名的数组大小 */
struct film
{
    char title[TSIZE];
    int rating;
};

/* 一般类型定义 */
typedef struct film Item;

typedef struct node
{
    Item item;     // 项目
    struct node * next;   // 存放下一个节点的地址
} Node;

typedef Node * List;   // List 就是 Node *

/* 函数原型*/
/* 操作： 初始化一个列表 */
/* 操作前： plist指向一个列表 */
/* 操作后： 该列表被初始化为一个空表 */
void InitializeList(List * plist); 

/* 操作： 确定列表是否为空 */
/* 操作前： plist指向一个已初始化列表 */
/* 操作后： 列表为空返回true， 反之，false */
bool ListIsEmpty(List * plist);

/* 操作： 确定列表是否已满 */
/* 操作前： plist指向一个已初始化列表 */
/* 操作后： 列表已满返回true， 反之，false */
bool ListIsFull(List * plist);

/* 操作： 确定列表中的项目个数 */
/* 操作前： plist指向一个已初始化列表 */
/* 操作后： 返回该列表中的项目个数 */
unsigned int ListItemCount(const List * plist);

/* 操作： 在列表尾部添加一个项目 */
/* 操作前： item是一个要被添加的项目，plist指向一个已初始化列表 */
/* 操作后： 操作成功返回true， 失败返回false */
bool AddItem(Item item, List * plist);

/* 操作： 把一个函数作用于列表的每个项目 */
/* 操作前： plist指向一个已初始化列表，pfun指向一个函数，该函数接收一个Item项目 */
/* 操作后： 指向的函数作用于每个项目 */
void Traverse(const List * plist, void (* pfun)(Item item));


/* 操作： 释放已分配的内存（如果有）*/
/* 操作前： plist指向一个已初始化列表 */
/* 操作后： 内存释放，列表被置为空表 */
void EmptyTheList(List * plist);

#endif
